﻿/*******************************************************************************/
/* Scheduler.cs
 * 
 * Datum van aanmaak:               06-10-2010 - Jordy Langen - 0864307
-* Datum van laatste aanpassing:    07-10-2010 - Jordy Langen - 0864307
 *
 * Deze klasse controleert of de timer gestart moet worden en wanneer dat zo
 * is zijn er 2 methodes om de timer te starten en de timer te stoppen
 * 
 * Controleertimer & StopTimer volgens versie 1.07
 *******************************************************************************/
using System.Collections.Generic;
using System.Timers;
using Roborally.CommonData.GlobaleTypes;
using Roborally.Scheidsrechter;

namespace Roborally.Spelleider
{

    internal class ZandLoper
    {
        private Timer timer;
        private int idTeller;
        private List<int> spelersIDs;
        private ScheidsRechter scheidsrechter;

        //Meerdere lijsten, niet opnemen in klassediagram
        private List<ProgramKaart> hand;

        private Spelleider spelLeider;

        /// <summary>
        /// De contructor van Scheduler.
        /// Hier word de timer geinitialiseerd en de timerElapsed event toegevoegd.
        /// De timerTeller word op 0 gezet, deze int houd het aantal keer bij dat de timer Tick event wordt aangeroepen.
        /// De idTeller word op 0 gezet, deze int wordt gebruikt voor het controleren
        /// van het aantal mensen die klaar zijn met het kiezen van hun kaarten.
        /// De lijst spelersIDs is een lijst met spelers die wordt gebruikt om te kijken welke speler zijn
        /// kaarten nog moet kiezen.
        /// </summary>
        public ZandLoper(Spelleider spelLeider, ScheidsRechter scheidsRechter)
        {
            this.scheidsrechter = scheidsRechter;
            this.spelLeider = spelLeider;
            timer = new Timer { Interval = scheidsrechter.VraagTimerTijd() * 1000 };
            timer.Elapsed += new ElapsedEventHandler(timerElapsed);
            idTeller = 0;
            spelersIDs = new List<int>();

        }

        /// <summary>
        /// De timer tick event van de timer.
        /// Wanneer de timer ticked moet de timer gestopt worden.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void timerElapsed(object sender, ElapsedEventArgs e)
        {
            timerGestopt();
            timer.Stop();
        }

        /// <summary>
        /// Het starten van de timer.
        /// </summary>
        private void startTimer()
        {
            timer.Start();
        }

        /// <summary>
        /// Het stoppen van de timer.
        /// Wanneer de timer gestopt is zal er een call worden gestuurd naar de spelLeider om de volgende ronde te starten.
        /// </summary>
        private void timerGestopt()
        {
            List<int> temp = new List<int>();
            foreach (SpelerInfo si in spelLeider.SpelersInfo)
            {
                temp.Add(si.Id);
            }
            for (int i = 0; i < temp.Count; i++)
            {
                for (int j = 0; j < spelersIDs.Count; j++)
                {
                    if (temp[i] == spelersIDs[j])
                    {
                        temp.Remove(i);
                        break;
                    }
                }
            }
            int laatsteSpeler = temp[0];
            spelLeider.legKaartenNeerVoor(laatsteSpeler);
            //Kaarten zijn gelegd
        }

        /// <summary>
        /// Loop: Voor elk spel dat er is
        /// Loop: Voor elk spelersinfo in het spel
        /// Controle: Wanneer het gevonden id gelijk is aan het gegeven id
        /// Controle: Wanneer alle kaarten gekozen zijn door 1 speler
        /// Zijn id opslaan in een lijst met spelers die 5 kaarten gekozen hebben
        /// Controle: Wanneer er nog n - 1 speler over is de timer starten
        /// De timer starten
        /// Controle: Wanneer idspelers.count = n
        /// De timer stoppen
        /// </summary>
        /// <param name="data">Het data object afkomstig van de MVC en deze bevat een KaartIndex & Spelers ID</param>
        public void ControleerTimer(SpelerLegtKaartenArgs data)
        {

            foreach (SpelerInfo info in spelLeider.SpelersInfo)
            {
                if (data != null && info.Id == data.SpelerIdentificatie)
                {
                    idTeller++;
                    spelersIDs.Add(info.Id);
                    //spelersIDs.
                }
            }

            if (idTeller == spelLeider.SpelersInfo.Count - 1)
            {
                startTimer();
            }
            else if (idTeller == spelLeider.SpelersInfo.Count)
            {
                stopTimer();
            }
        }

        private void stopTimer()
        {
            spelersIDs.Clear();
            idTeller = 0;
        }


        //StopTimerBinnenTijd
        //Methode aanroepen in timer tick event
        //De speler die niet voorkomt in de lijst controleren op 5 kaarten in de programmeerbaai
        //list.clear
    }


}
